package top.chmin.project.cloud.common;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * chmin
 * 2024/1/11 10:53
 * cloud-code
 */
public class StringFlexColumn<T extends Condition> extends ConditionColumn<T> {

    public StringFlexColumn(T t, String fieldName) {
        super(t, fieldName);
    }

    public T eq(String value) {
        if (value == null) return t;
        t.getWhereList().add(columnName + " = ?");
        t.getWhereValueList().add(value);
        return t;
    }

    public T ne(String value) {
        if (value == null) return t;
        t.getWhereList().add(columnName + " <> ?");
        t.getWhereValueList().add(value);
        return t;
    }

    public T like(String value) {
        if (value == null) return t;
        t.getWhereList().add(columnName + " like CONCAT('%%', ?, '%%')");
        t.getWhereValueList().add(value);
        return t;
    }

    public T leftLike(String value) {
        if (value == null) return t;
        t.getWhereList().add(columnName + " like CONCAT(?, '%%')");
        t.getWhereValueList().add(value);
        return t;
    }

    public T rightLike(String value) {
        if (value == null) return t;
        t.getWhereList().add(columnName + " like CONCAT('%%', ?)");
        t.getWhereValueList().add(value);
        return t;
    }

    public T in(String... values) {
        t.getWhereList().add(columnName + " IN (%s)".formatted(
                Stream.of(values)
                        .peek(v -> t.getWhereValueList().add(v))
                        .map(v -> "?")
                        .collect(Collectors.joining(", "))
        ));
        return t;
    }

    public T in(List<String> values) {
        t.getWhereList().add(columnName + " IN (%s)".formatted(
                values.stream()
                        .peek(v -> t.getWhereValueList().add(v))
                        .map(v -> "?")
                        .collect(Collectors.joining(", "))
        ));
        return t;
    }

    public T notIn(String... values) {
        t.getWhereList().add(columnName + " NOT IN (%s)".formatted(
                Stream.of(values)
                        .peek(v -> t.getWhereValueList().add(v))
                        .map(v -> "?")
                        .collect(Collectors.joining(", "))
        ));
        return t;
    }

    public T notIn(List<String> values) {
        t.getWhereList().add(columnName + " NOT IN (%s)".formatted(
                values.stream()
                        .peek(v -> t.getWhereValueList().add(v))
                        .map(v -> "?")
                        .collect(Collectors.joining(", "))
        ));
        return t;
    }

    public T between(String start, String end) {
        t.getWhereList().add(columnName + " BETWEEN (?, ?)");
        t.getWhereValueList().add(start);
        t.getWhereValueList().add(end);
        return t;
    }

    public T group() {
        t.getGroupList().add(columnName);
        return t;
    }

    public T asc() {
        t.getOrderList().add(columnName);
        return t;
    }

    public T desc() {
        t.getOrderList().add(columnName + " DESC");
        return t;
    }

    public T count() {
        t.getSelectList().add("COUNT(%s)".formatted(columnName));
        return t;
    }

    public T min() {
        t.getSelectList().add("MIN(%s)".formatted(columnName));
        return t;
    }

    public T max() {
        t.getSelectList().add("MAX(%s)".formatted(columnName));
        return t;
    }

    public T sum() {
        t.getSelectList().add("SUM(%s)".formatted(columnName));
        return t;
    }

    public T avg() {
        t.getSelectList().add("AVG(%s)".formatted(columnName));
        return t;
    }

}
